﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GalaSoft.MvvmLight.Command;
using System.Collections.ObjectModel;
using TraceInspector.Model;
using TraceInspector.Application;

namespace TraceInspector.ViewModel
{
    public class InspectionDetaisViewModel : MainMenuToolViewModel
    {
        private bool _isDirty = false;
        private readonly IUIDataProvider _dataProvider;
        private readonly IToolManager _toolManager;

        public InspectionDetaisViewModel(Model.Inspection inspectionModel,IUIDataProvider dataProvider, IToolManager toolManager) : base(toolManager)
        {
            _inspectionModel = inspectionModel;
            _dataProvider = dataProvider;
            _toolManager = toolManager;
            Title = "Параметры";
            CanClose = false;
        }

        public InspectionDetaisViewModel():base(null)
        {
            throw new NotImplementedException();
        }

        #region Properties

        Model.Inspection _inspectionModel;

        /// <summary>
        /// Дата модель обследования
        /// </summary>
        /// 
        public Inspection InspectionModel
        {
            get { return _inspectionModel; }
        }

        private Model.Report _selectedReportModel;

        /// <summary>
        /// Выбранный отчет
        /// </summary>
        public Model.Report SelectedReportModel
        {
            get { return _selectedReportModel; }
            set { _selectedReportModel = value; RaisePropertyChanged("SelectedReportModel"); }
        }


        private Model.Launch _selectedLaunchModel;

        /// <summary>
        /// Выбранный пропуск
        /// </summary>
        public Model.Launch SelectedLaunchModel
        {
            get { return _selectedLaunchModel; }
            set { _selectedLaunchModel = value; RaisePropertyChanged("SelectedLaunchModel"); }
        }

        /// <summary>
        /// Инструменты для редактирования свойств обследования (таких как пропуски и отчеты и т.д)
        /// </summary>
        public ObservableCollection<ToolViewModel> Tools
        { get { return _toolManager.Tools; } }


        #endregion

        #region Commands

        RelayCommand _saveChangesCommand;

        /// <summary>
        /// Сохраняет внесенные изменения
        /// </summary>
        public RelayCommand SaveChangesCommand
        {
            get { return _saveChangesCommand ?? (_saveChangesCommand = new RelayCommand(SaveChanges, CanSaveInspection)); }
        }

        /// <summary>
        /// Отображает инструмент для редактирования пропуска
        /// </summary>
        private RelayCommand _showLaunchCommand;

        public RelayCommand ShowLaunchCommand
        {
            get { return _showLaunchCommand ?? (_showLaunchCommand = new RelayCommand(ShowLaunch, () => _selectedLaunchModel != null)); }
        }

        /// <summary>
        /// Отображает инструмент для редактирования отчета
        /// </summary>
        private RelayCommand _showReportCommand;

        public RelayCommand ShowReportCommand
        {
            get { return _showReportCommand ?? (_showReportCommand = new RelayCommand(ShowReport, () => _selectedReportModel != null)); }
        }



        #endregion

        #region Methods

        /// <summary>
        /// Истина если были внесены изменения в свойства обследования
        /// </summary>
        /// <returns></returns>
        private bool CanSaveInspection()
        {
            return _isDirty;
        }

        /// <summary>
        /// Сохраняет внесенные изменения в свойства обследования
        /// </summary>
        private void SaveChanges()
        {
            _dataProvider.UpdateInspection(_inspectionModel);
            _isDirty = false;
        }

        /// <summary>
        /// Отображает информацию о выбранном пропуске
        /// </summary>
        private void ShowLaunch()
        {
            _toolManager.OpenTool<LaunchViewModel>(c => c.LaunchModel == SelectedLaunchModel, () => new LaunchViewModel(SelectedLaunchModel, _toolManager));
        }

        /// <summary>
        /// Отображает информацию о выбранном отчете
        /// </summary>
        private void ShowReport()
        {
            _toolManager.OpenTool<ReportViewModel>(c => c.ReportModel == SelectedReportModel, () => new ReportViewModel(SelectedReportModel, _toolManager));
        }

        

        /// <summary>
        /// Вызывается если одно из свойств обследования бы ло изменено
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void _inspection_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            _isDirty = true;
            SaveChangesCommand.RaiseCanExecuteChanged();
        }


        #endregion

    }
}
